﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.IO;

namespace Pittypat.Web
{
    /// <summary>
    /// 表示发送给客户端的错误消息。
    /// </summary>
    sealed class ErrorMessage : Message
    {
        private string message;

        /// <summary>
        /// 使用错误消息初始化 <see cref="ErrorMessage"/> 类的新实例。
        /// </summary>
        /// <param name="message">错误文本消息。</param>
        internal ErrorMessage(string message)
        {
            this.message = message ?? "";
        }

        /// <summary>
        /// 使用异常信息初始化 <see cref="ErrorMessage"/> 类的新实例。
        /// </summary>
        /// <param name="exc">错误异常对象。如果当前系统处在调试模式下，则发送堆栈跟踪信息，否则仅仅发送异常消息。</param>
        internal ErrorMessage(Exception exc)
        {
            if (exc == null)
            {
                this.message = "";
            }
            else
            {
#if DEBUG
                this.message = exc.ToString();
#else
                this.message = exc.Message;
#endif
            }
        }

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="ArgumentNullException">writer 是 null。</exception>
        public override void Write(TextWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            writer.Write("{{\"type\":\"error\",\"message\":\"{0}\"}}",
                Json.Escape(this.message));
        }

        /// <summary>
        /// 将当前对象转换字符串格式
        /// </summary>
        /// <returns>对象的字符串表示形式。</returns>
        public override string ToString()
        {
            return this.message;
        }
    }
}
